
curl -fL https://123.igp.wiki/ITResource/install-node-exporter.sh -o install-node-exporter.sh
chmod +x install-node-exporter.sh
./install-node-exporter.sh
如果希望顺手启用 systemd collector,可以这样运行:
curl -fL https://123.igp.wiki/ITResource/install-node-exporter.sh -o install-node-exporter.sh
chmod +x install-node-exporter.sh
NODE_EXPORTER_FLAGS='--collector.systemd' ./install-node-exporter.sh
如果希望排除一些临时文件系统和容器挂载点,可以这样运行:
curl -fL https://123.igp.wiki/ITResource/install-node-exporter.sh -o install-node-exporter.sh
chmod +x install-node-exporter.sh
NODE_EXPORTER_FLAGS='--collector.filesystem.mount-points-exclude=^/(dev|proc|run|sys|var/lib/docker/.+|var/lib/kubelet/.+)($|/)' ./install-node-exporter.sh
这个脚本固定安装 node_exporter 1.11.1,会自动识别 amd64 和 arm64,并把二进制文件安装到 /usr/local/bin/node_exporter,再创建 systemd 服务并设置开机自启。
在 Prometheus 监控体系里,node_exporter 负责采集 Linux 主机层面的运行指标,比如 CPU、内存、磁盘、文件系统、网络流量和系统负载等。只要把它部署到目标 Ubuntu 主机上,Prometheus 就可以通过 9100 端口定期拉取这些基础指标。
这篇文章记录一次最小化、可复用的安装流程:不依赖 Docker,直接把二进制文件安装到 /usr/local/bin/,再交给 systemd 管理。整个安装、用户创建、服务文件写入、启动和开机自启都放进一个 sh 脚本里,适合服务器、虚拟机、NAS 辅助主机等长期运行的 Linux 节点。
本文示例环境如下:
| 项目 | 说明 |
|---|---|
| 操作系统 | Ubuntu Server |
| 部署方式 | 二进制文件 + systemd |
| 运行用户 | node_exporter |
| 默认端口 | 9100 |
| 安装版本 | 1.11.1 |
| 脚本直链 | https://123.igp.wiki/ITResource/install-node-exporter.sh |
脚本使用下面两个安装包直链:
| 架构 | 安装包 |
|---|---|
amd64 |
https://123.igp.wiki/ITResource/package/node_exporter-1.11.1.linux-amd64.tar.gz |
arm64 |
https://123.igp.wiki/ITResource/package/node_exporter-1.11.1.linux-arm64.tar.gz |
#!/bin/sh
set -eu
VERSION="1.11.1"
SERVICE_USER="node_exporter"
INSTALL_DIR="/usr/local/bin"
ENV_FILE="/etc/default/node_exporter"
TEXTFILE_COLLECTOR_DIR="/var/lib/node_exporter/textfile_collector"
TMP_DIR="$(mktemp -d)"
NODE_EXPORTER_FLAGS="${NODE_EXPORTER_FLAGS:-}"
AMD64_URL="https://123.igp.wiki/ITResource/package/node_exporter-1.11.1.linux-amd64.tar.gz"
ARM64_URL="https://123.igp.wiki/ITResource/package/node_exporter-1.11.1.linux-arm64.tar.gz"
cleanup() {
rm -rf "$TMP_DIR"
}
trap cleanup EXIT
if [ "$(id -u)" -ne 0 ]; then
if ! command -v sudo >/dev/null 2>&1; then
echo "当前用户不是 root,且系统缺少 sudo。请使用 root 运行脚本,或先安装 sudo。"
exit 1
fi
SUDO="sudo"
else
SUDO=""
fi
ARCH="$(uname -m)"
case "$ARCH" in
x86_64|amd64)
PACKAGE_URL="$AMD64_URL"
PACKAGE_ARCH="amd64"
;;
aarch64|arm64)
PACKAGE_URL="$ARM64_URL"
PACKAGE_ARCH="arm64"
;;
*)
echo "不支持的系统架构:$ARCH"
exit 1
;;
esac
if command -v curl >/dev/null 2>&1; then
DOWNLOAD_CMD="curl -fL"
elif command -v wget >/dev/null 2>&1; then
DOWNLOAD_CMD="wget -O -"
else
echo "缺少下载工具,请先安装 curl 或 wget。"
exit 1
fi
echo "安装 node_exporter ${VERSION},架构:${PACKAGE_ARCH}"
cd "$TMP_DIR"
$DOWNLOAD_CMD "$PACKAGE_URL" > "node_exporter.tar.gz"
tar xzf "node_exporter.tar.gz"
$SUDO install -m 0755 "node_exporter-${VERSION}.linux-${PACKAGE_ARCH}/node_exporter" "${INSTALL_DIR}/node_exporter"
if ! id "$SERVICE_USER" >/dev/null 2>&1; then
$SUDO useradd --system --no-create-home --shell /usr/sbin/nologin "$SERVICE_USER"
fi
$SUDO chown "${SERVICE_USER}:${SERVICE_USER}" "${INSTALL_DIR}/node_exporter"
$SUDO mkdir -p "$TEXTFILE_COLLECTOR_DIR"
$SUDO chown -R "${SERVICE_USER}:${SERVICE_USER}" "/var/lib/node_exporter"
$SUDO tee "$ENV_FILE" >/dev/null <<EOF
NODE_EXPORTER_FLAGS='${NODE_EXPORTER_FLAGS}'
EOF
$SUDO tee /etc/systemd/system/node_exporter.service >/dev/null <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=${SERVICE_USER}
Group=${SERVICE_USER}
Type=simple
EnvironmentFile=-${ENV_FILE}
ExecStart=${INSTALL_DIR}/node_exporter \$NODE_EXPORTER_FLAGS
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
$SUDO systemctl daemon-reload
$SUDO systemctl enable node_exporter
if $SUDO systemctl is-active --quiet node_exporter; then
$SUDO systemctl restart node_exporter
else
$SUDO systemctl start node_exporter
fi
echo
${INSTALL_DIR}/node_exporter --version
echo
$SUDO systemctl --no-pager --full status node_exporter
脚本固定安装 node_exporter 1.11.1。这样文章、脚本和安装包直链是一一对应的,读者直接运行即可,不需要理解版本变量、替换下载地址,也不需要在安装时判断该填哪个包名。
脚本通过 uname -m 判断当前系统架构:
x86_64 / amd64 -> node_exporter-1.11.1.linux-amd64.tar.gz
aarch64 / arm64 -> node_exporter-1.11.1.linux-arm64.tar.gz
这样同一份脚本可以同时用于普通 x86 服务器、虚拟机,以及 ARM 主机。
脚本会创建独立的 node_exporter 系统用户,并写入 /etc/systemd/system/node_exporter.service。服务默认以低权限用户运行,网络就绪后启动,异常退出后自动重启:
Restart=on-failure
RestartSec=5s
安装完成后,脚本会执行:
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
如果服务已经在运行,脚本会改为重启服务。因此同一个脚本既可以用于首次安装,也可以用于重新应用启动参数。
node_exporter 的启动参数统一通过 NODE_EXPORTER_FLAGS 传入。例如:
NODE_EXPORTER_FLAGS='--collector.systemd' ./install-node-exporter.sh
脚本会把参数写入 /etc/default/node_exporter,systemd 服务通过 EnvironmentFile 读取:
EnvironmentFile=-/etc/default/node_exporter
ExecStart=/usr/local/bin/node_exporter $NODE_EXPORTER_FLAGS
后续如果要调整 flag,不需要手动编辑 systemd 服务文件,也不需要手动编辑 /etc/default/node_exporter。直接带着新的 NODE_EXPORTER_FLAGS 重新执行脚本即可:
NODE_EXPORTER_FLAGS='--collector.systemd --collector.filesystem.mount-points-exclude=^/(dev|proc|run|sys|var/lib/docker/.+|var/lib/kubelet/.+)($|/)' ./install-node-exporter.sh
默认 collector 已经覆盖 CPU、内存、磁盘、文件系统、网络、负载等核心主机指标。个人或小规模服务器场景下,可以先只加 systemd:
NODE_EXPORTER_FLAGS='--collector.systemd' ./install-node-exporter.sh
如果机器上有 Docker、Kubernetes 或较多临时挂载点,可以再加文件系统排除规则:
NODE_EXPORTER_FLAGS='--collector.systemd --collector.filesystem.mount-points-exclude=^/(dev|proc|run|sys|var/lib/docker/.+|var/lib/kubelet/.+)($|/)' ./install-node-exporter.sh
不建议一开始就使用 --collector.disable-defaults。这个参数会关闭默认 collector,再由你手动挑选采集项,更适合对指标数量和采集成本有严格要求的环境。
脚本会创建:
/var/lib/node_exporter/textfile_collector
这只是预留目录,不代表默认启用 textfile collector。以后如果需要把备份状态、证书剩余天数、脚本执行结果等自定义指标交给 node_exporter 暴露,再通过下面的方式启用:
NODE_EXPORTER_FLAGS='--collector.systemd --collector.textfile.directory=/var/lib/node_exporter/textfile_collector' ./install-node-exporter.sh
在服务器本机可以用 curl 访问指标接口:
curl http://127.0.0.1:9100/metrics
如果能看到大量以 node_ 开头的指标,例如:
node_cpu_seconds_total
node_memory_MemAvailable_bytes
node_filesystem_avail_bytes
node_network_receive_bytes_total
就说明 node_exporter 已经可以正常暴露主机指标。
如果 Prometheus 部署在其他机器上,还需要确认防火墙、安全组或组网策略允许访问目标主机的 9100 端口。
在 Prometheus 的配置文件中增加一个抓取任务:
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets:
- '<Ubuntu主机IP>:9100'
修改完成后,重载 Prometheus 配置,或者重启 Prometheus 服务。随后可以在 Prometheus Web 页面中打开 Status -> Targets,确认该目标是否为 UP。
这份脚本固定安装 node_exporter 1.11.1。后续如果要升级到新版本,建议重新发布一份对应版本的脚本和安装包直链,然后继续用同样的方式执行:
curl -fL https://123.igp.wiki/ITResource/install-node-exporter.sh -o install-node-exporter.sh
chmod +x install-node-exporter.sh
NODE_EXPORTER_FLAGS='--collector.systemd --collector.filesystem.mount-points-exclude=^/(dev|proc|run|sys|var/lib/docker/.+|var/lib/kubelet/.+)($|/)' ./install-node-exporter.sh
重新执行脚本会替换 /usr/local/bin/node_exporter,重写 systemd 服务文件,并重启已经运行的服务。
先确认服务是否运行:
sudo systemctl status node_exporter
再检查端口监听:
ss -lntp | grep 9100
如果本机可以访问,但 Prometheus 无法访问,通常是防火墙、安全组或网络 ACL 没有放行 9100 端口。
可以在 Prometheus 服务器上直接测试目标地址:
curl http://<Ubuntu主机IP>:9100/metrics
如果这里访问失败,优先排查网络连通性和端口放行;如果可以访问,再检查 Prometheus 的 targets 地址是否写错。
不建议直接把 9100 端口暴露到公网。node_exporter 本身主要负责暴露指标,不提供复杂的访问控制能力。更稳妥的做法是让 Prometheus 通过内网、VPN、Tailscale、WireGuard 或云厂商私有网络访问目标主机。
至此,Ubuntu 主机的 node_exporter 已经完成安装、托管和开机自启配置。对于一套 Prometheus 监控系统来说,这是接入 Linux 主机监控最基础的一步。
脚本入口保持为一条命令:下载、加执行权限、运行。默认场景可以不传 flag;需要 systemd 服务指标或文件系统排除规则时,就通过 NODE_EXPORTER_FLAGS 重新执行脚本,让安装和配置始终走同一个入口。